#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<queue>
#include<deque>
#include<vector>
#include<algorithm>
using namespace std;
int MonthDay[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };

class Date
{
public:
    friend ostream& operator<<(ostream& out, const Date& d)
    {
        cout << d._year << "-" << d._month << "-" << d._day;
        return out;
    }
    
    int GetMonthDay(int year, int month)
    {

        if (month == 2 && (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)))
            return 29;
        else return MonthDay[month];
    }
    Date(int year = 1900, int month = 1, int day = 1)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    Date(const Date& d)
    {
        _year = d._year;
        _month = d._month;
        _day = d._day;
    }
    Date& operator=(const Date& d)
    {
        Date ret(d);
        return ret;
    }
    bool operator==(const Date& d)
    {
        return (_year == d._year) && _month ==d._month && _day == d._day;
    }
    void operator_add1()
    {
        _day++;
        if (_day > GetMonthDay(_year, _month))
        {
            _day = 1;
            _month++;
            if (_month > 12)
            {
                _year++;
                _month = 1;
            }
        }
        

    }
    void operator_sub1()
    {
        _day--;
        if (_day < 1)
        {
            _month--;
            if (_month < 1)
            {
                _year--;
            }
            _day = GetMonthDay(_year, _month);
        }
        

    }
    Date operator+(int day)
    {
        Date tmp = Date(_year, _month, _day);
        while (day--)operator_add1();
        Date ret(_year, _month, _day);
        _year = tmp._year, _month = tmp._month, _day = tmp._day;
        
        return ret;
    }
    Date operator-(int day)
    {
        Date tmp = Date(_year, _month, _day);
        while (day--)operator_sub1();
        Date ret(_year, _month, _day);
        _year = tmp._year, _month = tmp._month, _day = tmp._day;

        return ret;
    }
    
private:
    int _year;
    int _month;
    int _day;
};

int main()
{
    Date d1(2020, 2, 20);
    cout << d1<< endl;
    Date d2 = d1 - 10;
    cout << d2 << endl;
    Date d3 = d1 + 100;
    cout << d3 << endl;
    return 0;
}
//int main()
//{
//    string num1; string num2;
//    num1 = "123", num2 = "456";
//    int n1 = num1.size();
//    int n2 = num2.size();
//    int n = (n1 + n2) ;
//    vector<int>num(n);
//    for (int i = n1 - 1; i >= 0; i--)
//    {
//        for (int j = n2 - 1; j >= 0; j--)
//        {
//            int x = num1[i] - '0';
//            int y = num2[j] - '0';
//            int tmp = x * y;
//            num[i + j-1] += tmp;
//        }
//    }
//    for (int i = n-1; i >=0; i--)
//    {
//        if (num[i] >= 10)
//        {
//            num[i - 1] += (num[i] / 10);
//            num[i] %= 10;
//        }
//    }
//    
//    string ret;
//    for (int i = 0; i < n; i++)
//    {
//        ret += char('0' + num[i]);
//    }
//    return 0;
//}
//int main()
//{
//    int numRows = 5;
//    vector<vector<int>>ret;
//  
//
//    for (int i = 0; i <= numRows; i++)
//    {
//        cout << "11111" << endl;
//        vector<int>tmp(i);
//        for (int j = 0; j < i; j++)
//        {
//            if (j == 0 || j == i - 1)
//                tmp[j] = 1;
//            else
//                tmp[j] = ret[i - 2][j - 1] + ret[i - 2][j];
//        }
//        if(i!=0)
//        ret.push_back(tmp);
//    }
    //int numRows = 5;
    //vector<vector<int>>ret;
    //

    //for (int i = 0; i < numRows; i++)
    //{
    //    cout << "11111" << endl;
    //    vector<int>tmp(i+1);
    //    for (int j = 1; j <= i; j++)
    //    {
    //        if (j == 1 || j == i )
    //            tmp[j-1] = 1;
    //        else
    //            tmp[j] = ret[i - 1][j - 1] + ret[i - 1][j];
    //    }
    //    ret.push_back(tmp);
    //}
//	return 0;
//}